package com.huang.atm;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();
    private Scanner sc = new Scanner(System.in);
    private Account loginAcc;
    {
        Account acc = new Account();
        acc.setUsername("荒天帝");
        acc.setPassword("123456");
        acc.setGender('男');
        acc.setCardId("12345678");
        acc.setLimit(1000);
        accounts.add(acc);
    }

    public void start() {
        while (true) {
            System.out.println("=========欢迎来到ATM系统==========");
            System.out.println("1.账户登录");
            System.out.println("2.账户开户");
            System.out.println("请选择~~");
            int choose = sc.nextInt();
            switch (choose) {
                case 1:
                    //登录
                    login();
                    break;
                case 2:
                    //开户
                    createAccount();
                    break;
                default:
                    System.out.println("没有此选项！");
            }
        }
    }

    /** 展示用户登录成功后的操作界面 */
    private void showUserCommand(){
        while (true) {
            System.out.println(loginAcc.getUsername() + "您可以进行以下操作：===========");
            System.out.println("1、查询账户");
            System.out.println("2、存款");
            System.out.println("3、取款");
            System.out.println("4、转账");
            System.out.println("5、修改密码");
            System.out.println("6、退出");
            System.out.println("7、注销当前账户");
            System.out.println("请输入您的选择");
            int command = sc.nextInt();
            switch(command){
                case 1:
                    //查询账户
                    showLoginAccount();
                    break;
                case 2:
                    //存款
                    depositMoney();
                    break;
                case 3:
                    //取款
                    withdrawMoney();
                    break;
                case 4:
                    //转账
                    transferMoney();
                    break;
                case 5:
                    //修改密码
                    updatePassword();
                    return;
                case 6:
                    //退出
                    System.out.println(loginAcc.getUsername() + "您退出系统成功");
                    return;
                case 7:
                    //注销当前账户
                    if (deletAccount()) {
                        return;//返回欢迎界面
                    }
                    break;
                default:
                    System.out.println("没有此选项，请确认~");
            }
        }
    }
    /** 修改密码操作 */
    private void updatePassword() {
        System.out.println("==修改密码操作==");
        while (true) {
            System.out.println("请输入当前密码：");
            String password = sc.next();
            //判断登录密码是否正确
            if(loginAcc.getPassword().equals(password)){
                while (true) {
                    //正确则可以开始修改密码了
                    //请输入新的密码
                    System.out.println("请输入新的密码：");
                    String newPassword = sc.next();
                    System.out.println("请再次输入密码");
                    String confirmPassword = sc.next();
                    //判断两次输入的密码是否一致
                    if(confirmPassword.equals(newPassword)){
                        //一样就可以更新账户密码了
                        loginAcc.setPassword(confirmPassword);
                        System.out.println("恭喜您，修改密码成功~~");
                        return;
                    }else{
                        //不一样
                        System.out.println("您输入的两次密码不一致~~");
                    }
                }

            }else{
                System.out.println("您输入的登录密码不正确~~");
            }
        }
    }

    private boolean deletAccount() {
        System.out.println("==销户操作==");
        //确认用户是否要销户
        System.out.println("您真的要销户吗？y/n");
        String command = sc.next();
        switch (command){
            case "y":
                //确认销户
                //判断当前账户是否还有余额
                if(loginAcc.getMoney() > 0){
                    //还有余额则不能销户
                    System.out.println("您当前的账户还有余额，不能销户~~");
                    return false;
                }else{
                    //表明可以销户了
                    accounts.remove(loginAcc);
                    System.out.println("您的账户销户成功~~");
                    return true;
                }
            default:
                System.out.println("好的，您的账户保留");
                return false;
        }
    }

    /** 转账 */
    private void transferMoney() {
        System.out.println("==转账操作==");
        //判断当前系统是否有其他账户
        if(accounts.size() < 2){
            System.out.println("当前系统只有您一个账户，不能转账~~");
            return;
        }
        //判断自己账户是否有钱
        if(loginAcc.getMoney() == 0){
            System.out.println("当前余额为0，不能转账~");
            return;
        }
        while (true) {
            //输入转账卡号
            System.out.println("请输入对方卡号：");
            String cardId = sc.next();
            // 判断当前卡号在系统是否存在
            Account acc = getAccountByCardId(cardId);
            if(acc == null){
                System.out.println("您输入的卡号不存在");
            }else{
                while (true) {
                    //说明卡号存在,请输入转账金额
                    System.out.println("请输入转账金额");
                    double money = sc.nextDouble();
                    //判断转账金额是否超过账户金额
                    if(loginAcc.getMoney() < money){
                        System.out.println("转账失败，您的余额为：" + loginAcc.getMoney());
                    }else{
                        //说明可以进行转账，认证对方姓氏
                        String name = "*" + acc.getUsername().substring(1);
                        System.out.println("请输入【" + name + "】的姓氏");
                        String preName = sc.next();
                        //判断是否认证成功
                        if(!acc.getUsername().startsWith(preName)){
                            //认证失败
                            System.out.println("认证失败");
                        }else {
                            //说明认证成功，开始转账
                            loginAcc.setMoney(loginAcc.getMoney() - money);
                            acc.setMoney(acc.getMoney() + money);
                            System.out.println("转账成功~~");
                            return;
                        }
                    }
                }
            }
        }
    }

    /** 取款 */
    private void withdrawMoney() {
        System.out.println("==取款操作==");
        //先判断账户的余额是否大于等于100
        if(loginAcc.getMoney() < 100){
            //如果小于100,则表示余额不足
            System.out.println("余额不足，不能取款，您当前的余额是：" + loginAcc.getMoney());
            return;//跳出并结束当前取款操作
        }
        while (true) {
            //说明余额充足可以取款
            System.out.println("请输入您取款的数目：");
            double money = sc.nextDouble();
            //判断取款金额是否足够
            if(loginAcc.getMoney() < money){
                //不足够
                System.out.println("余额不足，您当前的余额为：" + loginAcc.getMoney());
            }else{
                //余额足够 判断是否取款金额是否超过取款限额
                if(loginAcc.getLimit() < money){
                    System.out.println("您当前取款金额超过每次限额，您每次最多可取：" + loginAcc.getLimit());
                }else{
                    //取款成功,更新当前的账户余额
                    loginAcc.setMoney(loginAcc.getMoney() - money);
                    System.out.println("恭喜您取款" + money + "成功，您当前的余额为：" + loginAcc.getMoney() );
                    break;
                }

            }
        }
    }

    /** 存款 */
    private void depositMoney() {
        System.out.println("==存款操作==");
        System.out.println("请输入您要存款的数目：");
        double money = sc.nextDouble();
        //存款成功，更新账户余额
        loginAcc.setMoney(loginAcc.getMoney() + money);
        System.out.println("恭喜您，存款：" + money + "成功，您当前的余额是：" + loginAcc.getMoney());
    }

    /** 查询账户 */
    private void showLoginAccount(){
        System.out.println(loginAcc.getUsername() + "您的账户信息如下：==============");
        System.out.println("用户名：" + loginAcc.getUsername());
        System.out.println("卡号：" + loginAcc.getCardId());
        System.out.println("性别：" + loginAcc.getGender());
        System.out.println("余额：" + loginAcc.getMoney());
        System.out.println("取现额度：" + loginAcc.getLimit());
    }

    /** 完成用户登录操作 */
    private void login(){
        System.out.println("======用户登录=======");
        //判断当前系统中是否存在账户
        if(accounts.size() == 0){
            //当前系统没有账户，直接结束登录操作
            System.out.println("当前系统还没有账户哟~，请先开户后，再来登录哟~");
            return;//跳出登录方法
        }
        while (true) {
            //如果当前系统存在账户，提示用户输入卡号
            System.out.println("请输入您的卡号：");
            String cardId = sc.next();
            //根据卡号去账户集合中查询账户对象
            Account acc = getAccountByCardId(cardId);
            //如果没有找到账户对象，说明登录卡号不存在，提示继续输入卡号
            if(acc == null){
                System.out.println("您输入的卡号不存在，请确认~");
            }else{
                while (true) {
                    //如果找到了账户对象，说明卡号存在，继续输入密码
                    System.out.println("请您输入密码：");
                    String pwd = sc.next();
                    //如果密码不正确，提示继续输入密码
                    if(!acc.getPassword().equals(pwd)){
                        System.out.println("您输入的密码不正确，请确认~");
                    }else{
                        loginAcc = acc;
                        //如果密码正确，说明登录成功，并给出相应的提示
                        System.out.println("欢迎" + acc.getUsername() + "，登录成功，您的卡号是：" + acc.getCardId());
                        //......
                        showUserCommand();
                        return;
                    }
                }
            }
        }
    }
    private void createAccount() {
        //创建账户对象封装数据
        System.out.println("===========开户操作==============");
        Account account = new Account();
        System.out.println("请输入账户名：");
        String name = sc.next();
        account.setUsername(name);

        while (true) {
            System.out.println("请输入性别：");
            char gender = sc.next().charAt(0);
            if (gender == '男' || gender == '女') {
                account.setGender(gender);
                break;
            } else {
                System.out.println("性别只能是男或女");
            }
        }

        while (true) {
            System.out.println("请输入密码：");
            String password = sc.next();
            System.out.println("请输入确认密码：");
            String confirmPassword = sc.next();
            if (password.equals(confirmPassword)) {
                account.setPassword(confirmPassword);
                break;
            } else {
                System.out.println("两次输入的密码不一样");
            }
        }

        System.out.println("请输入每次取现限制额度");
        double limit = sc.nextDouble();
        account.setLimit(limit);

        //系统生成卡号
        String cardId = createCardId();
        account.setCardId(cardId);
        accounts.add(account);
        System.out.println("恭喜你，" + account.getUsername() + "开户成功，您的卡号是：" + account.getCardId());
    }

    /**
     * 定义方法，用来生成不重复的卡号
     */
    private String createCardId() {
        Random r = new Random();
        while (true) {
            //定义变量记录卡号
            String cardId = "";
            //循环生成卡号
            for (int i = 0; i < 8; i++) {
                int number = r.nextInt(10);//随机生成0-9
                cardId += number;
            }
            //判断卡号是否重复
            if (getAccountByCardId(cardId) == null) {
                //没有重复
                return cardId;
            }
        }
    }

    /**
     * 定义方法根据id查询账户
     *
     * @param cardId
     * @return
     */
    private Account getAccountByCardId(String cardId) {
        //遍历账户集合
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            //根据id判断是否查询到账户
            if (acc.getCardId().equals(cardId)) {
                //id相等，查询成功
                return acc;
            }
        }
        //查无此账户
        return null;
    }
}